# 通讯录管理程序
# 管理通讯录
# 添加联系人（姓名 电话号码 住址）
# 删除
# 修改
# 查询（列出所有 根据名字查询）
# 保存
# 读取

# 联系人
# person1 = {"name":"张三","tel":"13012341234","address":"中山路18路"}
# 通讯录所有联系人

# 开始

persons = []

# persons = [{"name": "姓名", "tel": "电话\t\t\t", "address": "地址"},
#            {"name": "张三", "tel": "13012341234", "address": "中山路18路"},
#            {"name": "李四", "tel": "13812341234", "address": "南京路18路"}]  # 首先建立一个通讯录


def printMenu():  # 打印一个菜单
    print('欢迎使用小德子通讯管理程序')
    print('请选择你要执行的操作')
    print('1.添加联系人信息')
    print('2.列出联系人信息')
    print('3.删除联系人信息')
    print('4.修改联系人信息')
    print('5.查询联系人信息')
    print('6.保存联系人信息')
    print('7.读取联系人信息')
    print('8.退出小德子通讯管理程序系统')


def add():
    print('1.添加联系人信息')
    name = input('请输入所需添加联系人的姓名：')
    tele = input('请输入所需添加联系人的电话：')
    addr = input('请输入所需添加联系人的地址：')
    persons.append({'name': name, 'tel': tele, 'address': addr})  # 在列表中添加一个元素（而该元素的类型是字典类型）


def listAll():
    print('2.列出联系人信息')
    print('姓名\t电话\t\t\t地址')
    for person in persons:  # 通过一个for循环达到遍历列表各元素并通过新的变量存储每个元素（每个元素又是字典型的）
        print(person['name'] + '\t' + person['tel'] + '\t' + person['address'])  # 依次打印新变量


def delete():
    print('3.删除联系人信息')
    name = input('请输入你要删除的联系人姓名:')
    # 以下有两种方式可以达到删除效果
    # 方式1  # 注意点：注意缩进 即 确认子系统
    #     for person in persons:                # 这里是通过for循环遍历列表各元素，并将列表persons中每个析出的元素存放在新变量 person 中
    #       if person['name'] == name:          # 其中嵌套一个判断语句 即判断每个析出的元素中的字典中的key值是否与输入名相同
    #           persons.remove(person)          # 若相同则 将列表persons中的这个元素person删除
    #           break

    # 方式2
    for i in range(len(persons)):  # 这里通过for循环遍历列表的长度（也就是列表中含有的元素个数）相当于析出列表各元素的下标
        if persons[i]['name'] == name:  # 其中嵌套一个判断语句 即判断列表下标由小到大的元素中（元素是字典类型）的key值是否与输入值相同
            persons.pop(i)  # 删除列表persons中对应的元素
            break


def modify():
    print('4.修改联系人信息')
    name = input('请输入需要修改的联系人姓名：')
    tele = input('请输入需要修改的联系人电话：')
    adre = input('请输入需要修改的联系人地址：')
    for person in persons:  # 通过一个for循环遍历列表persons中每一个元素，并将每个析出的元素存放在新的变量person中（列表的中每一个元素又是字典型的）
        if person['name'] == name:  # 其中嵌套一个判断语句 即判断列表中每个析出的元素中的字典的key值是否和输入值相同
            person['tel'] = tele
            person['address'] = adre  # 若相同则对列表内的指定元素（存放在每一个person中）进行修改
            break


def find():
    print('5.查询联系人信息')
    name = input('请输入你要查询的联系人姓名：')
    for person in persons:  # 通过一个for循环遍历列表persons中的每一个元素，并将每个析出的元素存放在新的变量person中（列表中每一个元素又是字典型的）
        if person['name'] == name:  # 其中嵌套一个if判断语句 即判断析出的每一个元素中的字典的key值是否与输入值相同
            print('姓名\t电话\t\t\t地址')
            print(person['name'] + '\t' + person['tel'] + '\t' + person['address'])  # 若相同 则打印出每个相同元素的字典中的各个值
            break


def save():
    print('6.保存联系人信息')
    f = open('通讯录.txt','w')            # 创建一个联系人文本
    for person in persons:              # 遍历内存中的联系人信息
        f.write(f'{person["name"]},{person["tel"]},{person["address"]}\n')     #将内存中的联系人信息 写入 硬盘‘通讯论’文件中
    f.close()                                                               #注意 这里存入时 数据与数据之间由逗号隔开 且每个人的数据单独占一行


def read():
    f = open('通讯录.txt','r')          #打开硬盘内的通讯录文本文件 且选读取模式
    content = f.read()                 #将文件内的内容进行变量定义
    lines = content.split('\n')        #将内容进行按行分割
    for line in lines:                 #遍历每一行
        # print(line)
        infor = line.split(',')        #将每一行的内容按照逗号分割
        # print(infor)
        if len(infor)>1:               #只要行的信息长度大于1 则写入空列表中
            dict = {'name':infor[0],'tel':infor[1],'address':infor[2]}    #将每行内容打包成字典
            persons.append(dict)        #将打包好的字典 添加进之前定义的空列表中
    f.close()



while True:  # 创建主程序 是一个不人为选择跳出就会一直循环的死循环
    printMenu()
    sel = int(input("你要执行的操作："))
    if sel == 1:
        add()
        print()
    elif sel == 2:
        listAll()
        print()
    elif sel == 3:
        delete()
        print()
    elif sel == 4:
        modify()
        print()
    elif sel == 5:
        find()
        print()
    elif sel == 6:
        save()
        print()
    elif sel == 7:
        read()
        print()
    elif sel == 8:
        break
